using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._DefenseTools._Visibility
{
    /// <summary>
    /// <para>Linear Line Of Sight</para>
    /// <para>Creates lines of sight between observers and targets.</para>
    /// <para>在观察者和目标之间创建视线。</para>
    /// </summary>    
    [DisplayName("Linear Line Of Sight")]
    public class LinearLineOfSight : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public LinearLineOfSight()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_observer_features">
        /// <para>Observers</para>
        /// <para>The input observer points.</para>
        /// <para>输入观察点。</para>
        /// </param>
        /// <param name="_in_target_features">
        /// <para>Targets</para>
        /// <para>The input target points.</para>
        /// <para>输入目标点。</para>
        /// </param>
        /// <param name="_in_surface">
        /// <para>Input Elevation Surface</para>
        /// <para>The input elevation raster surface.</para>
        /// <para>输入高程栅格表面。</para>
        /// </param>
        /// <param name="_out_los_feature_class">
        /// <para>Output Line Of Sight Feature Class</para>
        /// <para>The output feature class showing lines of visible and nonvisible surface areas.</para>
        /// <para>显示可见和不可见表面区域线的输出要素类。</para>
        /// </param>
        /// <param name="_out_sight_line_feature_class">
        /// <para>Output Sight Line Feature Class</para>
        /// <para>The output line feature class showing the direct line of sight between observer and target.</para>
        /// <para>显示观察点和目标之间的直接视线的输出线要素类。</para>
        /// </param>
        /// <param name="_out_observer_feature_class">
        /// <para>Output Observer Feature Class</para>
        /// <para>The output observer point feature class.</para>
        /// <para>输出观察点要素类。</para>
        /// </param>
        /// <param name="_out_target_feature_class">
        /// <para>Output Target Feature Class</para>
        /// <para>The output target point feature class.</para>
        /// <para>输出目标点要素类。</para>
        /// </param>
        public LinearLineOfSight(object _in_observer_features, object _in_target_features, object _in_surface, object _out_los_feature_class, object _out_sight_line_feature_class, object _out_observer_feature_class, object _out_target_feature_class)
        {
            this._in_observer_features = _in_observer_features;
            this._in_target_features = _in_target_features;
            this._in_surface = _in_surface;
            this._out_los_feature_class = _out_los_feature_class;
            this._out_sight_line_feature_class = _out_sight_line_feature_class;
            this._out_observer_feature_class = _out_observer_feature_class;
            this._out_target_feature_class = _out_target_feature_class;
        }
        public override string ToolboxName => "Defense Tools";

        public override string ToolName => "Linear Line Of Sight";

        public override string CallName => "defense.LinearLineOfSight";

        public override List<string> AcceptEnvironments => ["outputCoordinateSystem", "scratchWorkspace", "workspace"];

        public override object[] ParameterInfo => [_in_observer_features, _in_target_features, _in_surface, _out_los_feature_class, _out_sight_line_feature_class, _out_observer_feature_class, _out_target_feature_class, _in_obstruction_features, _observer_height_above_surface, _target_height_above_surface, _add_profile_attachment.GetGPValue()];

        /// <summary>
        /// <para>Observers</para>
        /// <para>The input observer points.</para>
        /// <para>输入观察点。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Observers")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_observer_features { get; set; }


        /// <summary>
        /// <para>Targets</para>
        /// <para>The input target points.</para>
        /// <para>输入目标点。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Targets")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_target_features { get; set; }


        /// <summary>
        /// <para>Input Elevation Surface</para>
        /// <para>The input elevation raster surface.</para>
        /// <para>输入高程栅格表面。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Elevation Surface")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_surface { get; set; }


        /// <summary>
        /// <para>Output Line Of Sight Feature Class</para>
        /// <para>The output feature class showing lines of visible and nonvisible surface areas.</para>
        /// <para>显示可见和不可见表面区域线的输出要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Line Of Sight Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_los_feature_class { get; set; }


        /// <summary>
        /// <para>Output Sight Line Feature Class</para>
        /// <para>The output line feature class showing the direct line of sight between observer and target.</para>
        /// <para>显示观察点和目标之间的直接视线的输出线要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Sight Line Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_sight_line_feature_class { get; set; }


        /// <summary>
        /// <para>Output Observer Feature Class</para>
        /// <para>The output observer point feature class.</para>
        /// <para>输出观察点要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Observer Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_observer_feature_class { get; set; }


        /// <summary>
        /// <para>Output Target Feature Class</para>
        /// <para>The output target point feature class.</para>
        /// <para>输出目标点要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Target Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_target_feature_class { get; set; }


        /// <summary>
        /// <para>Input Obstruction Features</para>
        /// <para>The input multipatch feature that may obstruct the lines of sight.</para>
        /// <para>可能阻碍视线的输入多面体要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Obstruction Features")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _in_obstruction_features { get; set; } = null;


        /// <summary>
        /// <para>Observer Height Above Surface (meters)</para>
        /// <para>The height added to the surface elevation of the observer. The default is 2.</para>
        /// <para>添加到观察点表面高程的高度。默认值为 2。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Observer Height Above Surface (meters)")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _observer_height_above_surface { get; set; } = 2;


        /// <summary>
        /// <para>Target Height Above Surface (meters)</para>
        /// <para>The height added to the surface elevation of the target. The default is 0.</para>
        /// <para>添加到目标表面高程的高度。默认值为 0。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Target Height Above Surface (meters)")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _target_height_above_surface { get; set; } = 0;


        /// <summary>
        /// <para>Add Profile Graph Attachment To Sight Line</para>
        /// <para><xdoc>
        ///   <para>Specifies whether the tool will add an attachment to the feature with the profile (cross section terrain graph) between observer and target.</para>
        ///   <bulletList>
        ///     <bullet_item>No profile graph—A profile graph will not be added. This is the default.</bullet_item><para/>
        ///     <bullet_item>Adds a profile graph—A profile graph will be added.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定工具是否将附件添加到具有观察点和目标之间的轮廓（横截面地形图）的要素。</para>
        ///   <bulletList>
        ///     <bullet_item>无剖面图—不会添加剖面图。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>添加剖面图—将添加剖面图。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Add Profile Graph Attachment To Sight Line")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _add_profile_attachment_value _add_profile_attachment { get; set; } = _add_profile_attachment_value._false;

        public enum _add_profile_attachment_value
        {
            /// <summary>
            /// <para>ADD_PROFILE_GRAPH</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("ADD_PROFILE_GRAPH")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NO_PROFILE_GRAPH</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NO_PROFILE_GRAPH")]
            [GPEnumValue("false")]
            _false,

        }

        public LinearLineOfSight SetEnv(object outputCoordinateSystem = null, object scratchWorkspace = null, object workspace = null)
        {
            base.SetEnv(outputCoordinateSystem: outputCoordinateSystem, scratchWorkspace: scratchWorkspace, workspace: workspace);
            return this;
        }

    }

}